home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / gcc / libnix.lha / gnu / lib / libnix / sources.lha / nix / extra / fstat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-07-24  |  3.0 KB  |  105 lines

  1. #include <sys/types.h>
  2. #include <sys/file.h>
  3. #include <sys/stat.h>
  4. #include <exec/memory.h>
  5. #include <dos/dosextens.h>
  6. #ifdef __GNUC__
  7. #include <inline/dos.h>
  8. #include <inline/exec.h>
  9. #endif
  10. #include <stabs.h>
  11.  
  12. extern void __seterrno(void);
  13.  
  14. extern unsigned long *__stdfiledes;
  15.  
  16. int __stat(struct stat *buf,struct FileInfoBlock *fib)
  17. {
  18.    buf->st_dev=0;
  19.    buf->st_ino=fib->fib_DiskKey;
  20.    buf->st_mode=
  21.      (fib->fib_DirEntryType<0?S_IFREG:
  22.         (fib->fib_DirEntryType!=ST_SOFTLINK?S_IFDIR:S_IFLNK))|
  23.      (fib->fib_Protection&FIBF_READ?0:S_IRUSR)|
  24.      (fib->fib_Protection&FIBF_WRITE?0:S_IWUSR)|
  25.      (fib->fib_Protection&FIBF_EXECUTE?0:S_IXUSR)|
  26.      (fib->fib_Protection&FIBF_GRP_READ?S_IRGRP:0)|
  27.      (fib->fib_Protection&FIBF_GRP_WRITE?S_IWGRP:0)|
  28.      (fib->fib_Protection&FIBF_GRP_EXECUTE?S_IXGRP:0)|
  29.      (fib->fib_Protection&FIBF_OTR_READ?S_IROTH:0)|
  30.      (fib->fib_Protection&FIBF_OTR_WRITE?S_IWOTH:0)|
  31.      (fib->fib_Protection&FIBF_OTR_EXECUTE?S_IXOTH:0);
  32.    buf->st_nlink=0;
  33.    buf->st_uid=fib->fib_OwnerUID;
  34.    buf->st_gid=fib->fib_OwnerGID;
  35.    buf->st_rdev=0;
  36.    buf->st_size=fib->fib_Size;
  37.    buf->st_atime=buf->st_mtime=buf->st_ctime=
  38.      ((fib->fib_Date.ds_Days+2922)*1440+fib->fib_Date.ds_Minute)*60+
  39.      fib->fib_Date.ds_Tick/TICKS_PER_SECOND;
  40.    buf->st_spare1=buf->st_spare2=buf->st_spare3=0;
  41.    buf->st_blksize=512;
  42.    buf->st_blocks=fib->fib_NumBlocks;
  43.    return 0;
  44. }
  45.  
  46. int stat(const char *name,struct stat *buf)
  47. { struct FileInfoBlock *fib;
  48.   BPTR lock;
  49.   int ret=-1;
  50.  
  51.   if((lock=Lock((STRPTR)name,SHARED_LOCK))!=0)
  52.   {
  53.     if((fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))!=NULL)
  54.     { if(Examine(lock,fib)!=DOSFALSE)
  55.         ret=__stat(buf,fib);
  56.       else
  57.         __seterrno();
  58.       FreeDosObject(DOS_FIB,fib);
  59.     }
  60.     else
  61.       __seterrno();
  62.     UnLock(lock);
  63.   }
  64.   else
  65.     __seterrno();
  66.     
  67.   return ret;
  68. }
  69.  
  70. int fstat(int d,struct stat *buf)
  71. { struct FileInfoBlock *fib;
  72.   int ret=-1;
  73.  
  74.   if((fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))!=NULL)
  75.   {
  76.     if(ExamineFH(__stdfiledes[d],fib)!=DOSFALSE)
  77.       ret=__stat(buf,fib);
  78.     else
  79.       __seterrno();
  80.     FreeDosObject(DOS_FIB,fib);
  81.   }
  82.   else
  83.     __seterrno();
  84.   return ret;
  85. }
  86.  
  87. int chmod(const char *name, mode_t mode)
  88. { int ret;
  89.  
  90.   if ((ret=~(SetProtection((STRPTR)name,((mode&S_IRUSR?0:FIBF_READ)|
  91.                                          (mode&S_IWUSR?0:FIBF_WRITE|FIBF_DELETE)|
  92.                                          (mode&S_IXUSR?0:FIBF_EXECUTE)|
  93.                                          (mode&S_IRGRP?FIBF_GRP_READ:0)|
  94.                                          (mode&S_IWGRP?FIBF_GRP_WRITE|FIBF_GRP_DELETE:0)|
  95.                                          (mode&S_IXGRP?FIBF_GRP_EXECUTE:0)|
  96.                                          (mode&S_IROTH?FIBF_OTR_READ:0)|
  97.                                          (mode&S_IWOTH?FIBF_OTR_WRITE|FIBF_OTR_DELETE:0)|
  98.                                          (mode&S_IXOTH?FIBF_OTR_EXECUTE:0))))))
  99.     __seterrno();
  100.                               
  101.   return ret;
  102. }
  103.  
  104. ALIAS(lstat,stat);
  105.